From: Ivan Molodetskikh Date: Tue, 5 Jan 2021 13:45:55 +0000 (+0300) Subject: st/texture-cache: Move icon theme lookup out of the hot path X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~616^2^2~644 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=b51be0e389d92e6b1b444d3134b96c3bfe134bb0;p=gnome-shell.git st/texture-cache: Move icon theme lookup out of the hot path It was showing up on profile traces over at https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1547#note_996417 After this change it no longer does. Part-of: --- diff --git a/src/st/st-texture-cache.c b/src/st/st-texture-cache.c index 744acd509..89620706c 100644 --- a/src/st/st-texture-cache.c +++ b/src/st/st-texture-cache.c @@ -974,7 +974,6 @@ st_texture_cache_load_gicon (StTextureCache *cache, g_autofree char *key = NULL; float actor_size; GtkIconTheme *theme; - GtkIconInfo *info; StTextureCachePolicy policy; StIconColors *colors = NULL; StIconStyle icon_style = ST_ICON_STYLE_REQUESTED; @@ -1014,11 +1013,6 @@ st_texture_cache_load_gicon (StTextureCache *cache, lookup_flags |= GTK_ICON_LOOKUP_DIR_LTR; scale = ceilf (paint_scale * resource_scale); - info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon, - size, scale, - lookup_flags); - if (info == NULL) - return NULL; gicon_string = g_icon_to_string (icon); /* A return value of NULL indicates that the icon can not be serialized, @@ -1046,14 +1040,21 @@ st_texture_cache_load_gicon (StTextureCache *cache, actor = create_invisible_actor (); clutter_actor_set_size (actor, actor_size, actor_size); - if (ensure_request (cache, key, policy, &request, actor)) - { - /* If there's an outstanding request, we've just added ourselves to it */ - g_object_unref (info); - } - else + if (!ensure_request (cache, key, policy, &request, actor)) { /* Else, make a new request */ + GtkIconInfo *info; + + info = gtk_icon_theme_lookup_by_gicon_for_scale (theme, icon, + size, scale, + lookup_flags); + if (info == NULL) + { + g_hash_table_remove (cache->priv->outstanding_requests, key); + texture_load_data_free (request); + g_object_unref (actor); + return NULL; + } request->cache = cache; /* Transfer ownership of key */